package com.andreas.controller;

import com.andreas.domain.Menu;
import com.andreas.dto.MenuDTO;
import com.andreas.service.MenuService;
import com.andreas.vo.MenuVO;
import com.andreas.vo.ResponseResultVO;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 描述：MenuController -- 通过递归的方式查找和测试对应的findMenuInfoById
 */
@RestController
@RequestMapping("menu")
public class MenuController {
    @Autowired
    private MenuService menuService;

    /**
     * @Author: andreaszhou
     * @Description: 查询菜单列表 currentPage:当前页大小 pageSize:页大小 因为分页PageHelper问题，此处需要做修改
     * @DateTime: 2021/7/26 21:42
     * @Params:
     * @Return
     */
    @RequestMapping("findAllMenu")
    public ResponseResultVO findAllMenu(@Param("currentPage") Integer currentPage, @Param("pageSize") Integer pageSize) {
        Map<Object, Object> map = menuService.findAllMenu(currentPage, pageSize);
        return new ResponseResultVO(null, 200, "响应成功", map);
    }

    /**
     * @Author: andreaszhou
     * @Description: 根据菜单ID查询菜单信息  ### 接口是最重要的接口, 这是一个最复杂的菜单信息回显接口
     * 如果是新增菜单，则ID值为-1, 那么就是新增时候的回显，如果是修改菜单，则为当前选择的id的值，那么就是修改时候的回显
     * 查询菜单的信息，也就是一个回显的过程，因此在这里我们要做一个回显的操作 因为全部挂载到同一个地方，所以在这里的只要显示父级为-1的代码即可。
     * @DateTime: 2021/7/26 21:57
     * @Params: id Integer 采用restful http的风格
     * @Return
     */
    @RequestMapping("findMenuInfoById/{id}")
    public ResponseResultVO findMenuInfoById(@PathVariable("id") Integer id) {
        // 根据id的值判断当前是更新还是添加操作，判断id的值是否为-1
        if (id == -1) {
            // 添加  回显信息中不需要查询menu信息
            List<MenuVO> subMenuListByPid = menuService.findSubMenuListByPid(-1);
            // 封装数据
            Map<String, Object> map = new HashMap<>();
            map.put("menuInfo", null);
            map.put("parentMenuList", subMenuListByPid);
            return new ResponseResultVO(true, 200, "添加回显成功", map);
        } else {
            // 修改操作 回显所有menu信息  修改时的回显  因为修改的时候，对应的菜单是有id的值
            Menu menu = menuService.findMenuById(id);
            List<MenuVO> subMenuListByPid = menuService.findSubMenuListByPid(-1);
            // 封装数据 -- 将当前menu和subMenuListById封装到map中
            Map<String, Object> map = new HashMap<>();
            map.put("menuInfo", menu); // 当前menu的信息
            map.put("parentMenuList", subMenuListByPid); // 所有的menu信息
            return new ResponseResultVO(true, 200, "响应成功", map);
        }
    }

    /**
     * @Author: andreaszhou
     * @Description: 添加&修改菜单
     * @DateTime: 2021/7/26 22:04
     * @Params:
     * @Return
     */
    @RequestMapping("saveOrUpdateMenu")
    public ResponseResultVO saveOrUpdateMenu(@RequestBody MenuDTO dto) {
        if (dto.getId() != null) {
            Integer integer = menuService.updateMenu(dto);
            if (integer == 1) {
                return new ResponseResultVO(true, 200, "修改成功", null);
            } else {
                return new ResponseResultVO(false, 500, "修改菜单信息失败", null);
            }
        } else {
            Integer integer = menuService.saveMenu(dto);
            if (integer == 1) {
                return new ResponseResultVO(true, 200, "保存成功", null);
            } else {
                return new ResponseResultVO(false, 500, "保存菜单信息失败", null);
            }
        }
    }

    /**
     * @Author: andreaszhou
     * @Description: 删除菜单信息
     * @DateTime: 2021/7/29 22:45
     * @Params:
     * @Return
     */
    @RequestMapping("deleteMenu")
    public ResponseResultVO deleteMenu(@RequestBody MenuDTO dto) {
        // 先判断当前菜单下面是否有子菜单，如果有子菜单则提示不能删除
        Integer num = menuService.isSubMenu(dto.getId());
        if (num > 0) {
            return new ResponseResultVO(false, 100, "当前菜单下面有子菜单，无法删除菜单信息", null);
        }
        Integer integer = menuService.deleteMenu(dto.getId());
        if (integer == 1) {
            return new ResponseResultVO(true, 200, "删除菜单信息成功", null);
        } else {
            return new ResponseResultVO(false, 500, "删除菜单信息错误", null);
        }
    }
}
